// es5中函数缺少值的时候的处理方法
function f(x, y, z) {
    if (y === undefined) {
        y = 7
    }
    if (z === undefined) {
        z = 42
    }
    return x + y + z;
}
console.log(f(1, 8)) //51

// es6
function f(x, y = 7, z = 42) {
    return x + y + z
}

console.log(f(1, 8)) //51
console.log(f(1, '', 43)) //143

console.log(f(1, undefined, 43)) //跳过中间有默认值的参数

// 参数的默认值可以是其他参数的运算表达式
function f1(x, y = 7, z = x + y) {
    console.log(Array.from(arguments));
    console.log(f1.length) //获取到函数参数没有默认值的个数
    return x * 10 + z
}
console.log(f1(1, undefined, 2)); //12


// es5中获取函数参数累加
function sum() {
    let num = 0;
    // Array.prototype.forEach.call(arguments, function (item) {
    //     num+=item*1
    // })
    Array.from(arguments).forEach(function (item) {
        num += item * 1
    })
    return num
}
console.log('es5sum:' + sum(1, 2, 3)); //6

// es6获取函数参数的累加
function sum2(...nums) {
    //...叫Rest Parameter  意思就是所有的参数都放在后面的变量中,是一个数组类型
    let num = 0;
    nums.forEach(function (item) {
        num += item * 1
    })
    return num
}

console.log('es6sum:' + sum2(1, 2, 3)); //6

function sum3(base, ...nums) {
    // 把第一个参数放在base变量中，剩余的放在nums中
    let num = 0;
    nums.forEach(function (item) {
        num += item * 1
    })
    return base * 2 + num
}

console.log('es6sum:' + sum3(1, 2, 3)); //7

function sum4(x = 1, y = 2, z = 3) {
    return x + y + z
}
let data = [4, 5, 6]
console.log('es5计算周长:' + sum4(data[0], data[1], data[2]))
// es5:
console.log('es5计算周长:' + sum4.apply(this, data));
// es6 叫spread和restParameter相反:
console.log('es6方法计算数组参数周长:' + sum4(...data)) //变量参数...是相反的